class Test5:
    """这是一条注释"""
    pass
print(dir(Test5))#查看所有属性和方法
'''
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__firstlineno__', '__format__', '__ge__', '__getattribute__', '__getstate__',
'__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__static_attributes__', '__str__', '__subclasshook__', '__weakref__']
'''
print(Test5.__dict__)
'''
{'__module__': '__main__', '__firstlineno__': 1, '__doc__': '这是一条注释', '__static_attributes__': (),
'__dict__': <attribute '__dict__' of 'Test5' objects>, '__weakref__': <attribute '__weakref__' of 'Test5' objects>}
'''
#__doc__返回类中的注释
print(Test5.__doc__)#这是一条注释
#__module__返回类所在的模块
from test.testpackage1 import Student
i=Student('uni',19,'python','m','123456')
print(i.__module__)#test.testpackage1
#__call__允许类像实例一样调用实例方法
class Test6:
    def __init__(self):
        print('执行__init__')
    def __call__(self, *args, **kwargs):
        print('执行__call__')
test2=Test6()#执行__init__,创建时执行__init__
test2()#执行__call__,调用时执行__call__
Test6()()
'''
执行__init__
执行__call__
说明直接调用类既执行__init__()又执行__call__（），有先后顺序
'''
#__dict__查看类或对象的属性
print(i.__dict__)#{'name': 'uni', '_Student__age': 19, 'subject': 'python', 'gender': 'm', '_Student__password': '123456', 'visit_times': 0}
print(Student.__dict__)
'''
{'__module__': 'test.testpackage1', '__firstlineno__': 3, 'people': 1,
'__init__': <function Student.__init__ at 0x000001C13E423D80>,
'_Student__login': <function Student.__login at 0x000001C13E423E20>,
'share_info': <function Student.share_info at 0x000001C13E423EC0>,
'study': <function Student.study at 0x000001C13E423F60>
 'play_games': <function Student.play_games at 0x000001C13E430040>,
 'count': <classmethod(<function Student.count at 0x000001C13E4300E0>)>,
 '__static_attributes__': ('__age', '__password', 'gender', 'name', 'subject', 'visit_times'),
 '__dict__': <attribute '__dict__' of 'Student' objects>,
 '__weakref__': <attribute '__weakref__' of 'Student' objects>,
 '__doc__': None}
 在查看类的属性时，类中定义的属性和方法都包括在内
 与dir相比，__dict__以字典形式打印，dir()包含__dict__中的内容(参考上面的对比)
'''
#__str__前面讲过，让对象也拥有一个字符串类型的返回值
#__getitem__(),__setitem__(),__delitem__()
class Test7:
    def __getitem__(self, key):
        print('这是__getitem__',key)
    def __setitem__(self, key, value):
        print('这是__setitem__',key,value)
    def __delitem__(self, key):
        print('这是__delitem__',key)
ii=Test7()
res=ii['name']#这是__getitem__ name
ii['name']='Res'#这是__setitem__ name Res
del ii['name']#这是__delitem__ name


'''
文件操作
1）open打开文件，返回文件的操作对象
2）read读取文件内容
3）write写入
4）close关闭
'''
iii=open('E:\\python learning notes\\files.txt','r')#a追加，r只读，w只写
print('文件访问模式',iii.mode)#文件访问模式 r,表示只读
print('文件格式',iii.encoding)#文件格式 cp936
print('文件名',iii.name)#文件名 E:\python learning notes\files.txt
print('文件状态',iii.closed)#文件状态 False，表示未关闭
file_text=iii.read(4)
print(file_text)#UnicodeDecodeError绷不住了
#hello world     现在好了，看来没有配置gbc不能直接输入汉字
#参数填入4后，输出变成了hell
iii.close()
print('文件状态',iii.closed)#文件状态 TruE，表示关闭
#iii=open('E:\\python learning notes\\files.txt','a')
#iii.write(file_text*2)
iii=open('E:\\python learning notes\\files.txt','r')
file_text=iii.read()
print('内容变成：',file_text)#内容变成： hello worldhellhell
iii.close()
#w进行覆盖写
iii=open('E:\\python learning notes\\files.txt','w+')
iii.write('hello world')
